package interview.huawei.tjt.training.dongtaiguihua;

import java.util.Scanner;

/**
 * https://leetcode-cn.com/problems/uncrossed-lines/
 *
 * 我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。
 *
 * 现在，我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线，只要 A[i] == B[j]，且我们绘制的直线不与任何其他连线（非水平线）相交。
 *
 * 以这种方法绘制线条，并返回我们可以绘制的最大连线数。
 *
 * 输入：nums1 = [1,4,2], nums2 = [1,2,4]
 * 输出：2
 * 解释：可以画出两条不交叉的线，但无法画出第三条不相交的直线，因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。
 */
// 思路：直接可以转化为求两个数组的最长公共子序列的长度（不一定要连续）
public class MaxUncrossedLines {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] strings1 = scanner.nextLine().split(",");
        String[] strings2 = scanner.nextLine().split(",");
        int[] nums1 = new int[strings1.length];
        int[] nums2 = new int[strings2.length];
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];
        for (int i = 0; i < strings1.length; i ++) {
            if (!strings1[i].equals("")) {
                nums1[i] = Integer.parseInt(strings1[i]);
            }
            // 这里初不初始化都没关系，因为数组的默认值就是0
            dp[i][0] = 0;
        }
        for (int i = 0; i < strings2.length; i ++) {
            if (!strings2[i].equals("")) {
                nums2[i] = Integer.parseInt(strings2[i]);
            }
            // 这里初不初始化都没关系，因为数组的默认值就是0
            dp[0][i] = 0;
        }
        for (int i = 1; i <= nums1.length; i ++) {
            for (int j = 1; j <= nums2.length; j ++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i][j - 1],dp[i - 1][j]);
                }
            }
        }
        System.out.println(dp[nums1.length][nums2.length]);
    }

}
